package juc_synchronized;

import java.util.concurrent.Semaphore;

/**
 * ClassName: SemaphoreTest
 * Package: juc_synchronized
 *
 * @Author 马学兴
 * @Create 2024/3/17 15:01
 * @Version 1.0
 * Description:信号量的意思，通过这个类，可以控制控制某个资源最多可以被几个线程所持有。
 * 和CountDownLatch一样，有一个实现了同步队列接口的内部类
 */
public class SemaphoreTest {

    // 假设有两个许可证，每次打饭都需要一个许可证
    static Semaphore semaphore = new Semaphore(4);

    static class EatingThread implements Runnable{
        @Override
        public void run() {
            // 尝试是否能够拿到可用的许可证
            try {
                semaphore.acquire();
                System.out.println(Thread.currentThread() + "拿到许可证了，窗口办理事情中");
                Thread.sleep(10000);
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                // 释放持有的许可证
                semaphore.release();
            }

        }
    }

    // 开始测试
    public static void main(String[] args) {
        // 10个人来银行办理，不过总共只有3个窗口，每次只能有三个人同时在办理
        for (int i = 0; i < 10; i++) {
            Thread t = new Thread(new EatingThread());
            t.start();
        }
    }
}


